/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package computacaografica;

import com.sun.security.auth.module.JndiLoginModule;
import computacaografica.formas.Formas;
import computacaografica.formas.GraphicsHeitor;
import computacaografica.formas.Oval;
import computacaografica.formas.Reta;
import computacaografica.formas.Retangulo;
import computacaografica.formas.RetanguloRound;
import computacaografica.formas.Triangulo;
import computacaografica.formas.TrianguloRet;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Label;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.BevelBorder;//Logitech
import javax.swing.border.Border;
import javax.swing.colorchooser.ColorSelectionModel;

/**
 *
 * @author Heitor
 */
public final class Janela extends JFrame implements MouseListener, ActionListener, MouseMotionListener, AdjustmentListener {
    
    // Instancia estática privada que será acessada
    private static Janela janela = new Janela(); 
    
    public static LinkedList<Shape> listaFormas = new LinkedList<Shape>();
    private static final long serialVersionUID = 1L;
    private JMenu menuPrincipal;
    private JMenuBar jMenuBar;
    private Panel jpanel;
    private JPanel panelPrincipal, panelToolBar, panelStatus, panelToolBarStatus;
    private JButton buttonAmarelo, buttonRetangulo, buttonLapis, buttonOval, buttonTriangulo, buttonReta, buttonRetanguloCA;
    private JButton buttonPentagono, buttonLosango, buttonHexagono, buttonPoligono, buttonTrianguloRet;
    private JButton buttonSetaCima, buttonSetaBaixo, buttonSetaDir, buttonSetaEsquerda;
    private JButton buttonEstrela4, buttonEstrela5, buttonEstrela6;
    private JMenu menuFiguras;
    private JComboBox cbPreencher;
    private JButton buttonCorLinha;
    private JComboBox cbEspessura;
    private JButton buttonCorPreench;
    private JButton buttonTransladar;
    private JButton buttonCisalhar;
    private JButton buttonEscalar;
    private JButton buttonRotacionar;
    private JSeparator separador;
    private JMenuItem itemMenuFigRatangulo, itemMenuAbrir, itemMenuSalvar;
    private JToolBar toolBar, toolBarFormas, toolBarTransformacao;
    private JLabel labelImageCursor;
    private JLabel labelCursor;
    private Color corLinha = Color.RED;
    private Color corPreenchimento = Color.YELLOW;
    
    private boolean preencher = false;
    private float espessura = 1;
    private Color colorPanelToolBar = new Color(220, 230, 244);
    private Color colorToolBarFormas = new Color(243, 247, 252);
    private Color colorBarraStatus = new Color(241, 237, 237);
    private int tamanhoApagar;
    //valor da Altula e Largula
    private int valorAltura;
    private int valorLargura;
    //Coordenadas atuais do mouse
    private int mousex;
    private int mousey;
    //Coordenadas anteiores do mouse
    private int prevx;
    private int prevy;
    //Coordenada X e Y para controle
    private int iniX;
    private int iniY;
    private int desenhaX;
    private int desenhaY;
    /*Flags para iniciar o desenho*/
    private boolean iniciaRetangulo = true;
    private boolean iniciaOval = true;
    private boolean iniciaTriangulo = true;
    private boolean iniciaRetanguloCA = true;
    private boolean iniciaLapis = true;
    private boolean iniciaReta = true;
    private boolean iniciaPoligno = true;
    
    
    //Variaveis para transformações
    private int transladarX = 0;
    private int transladarY = 0;
    private boolean isTransladar = false;
    
    private double cisalarX =0;
    private double cisalarY =0;
    private boolean isCisalhar = false;
    
    private double rotacionar = 0;
    private boolean isRotacionar=false;
    
    private boolean isEscalar = false;
    private double   escalarX =0;
    private double  escalarY =0;


    // Método público estático de acesso único ao objeto!
    public static Janela obj(){
        return janela;
    }

    // Construtor privado. 
    private Janela() {
        super("Computação Grafica");
        WindowUtilities.setNativeLookAndFeel();

//        setSize(700, 700);
//        setVisible(true);
        jMenuBar = new JMenuBar();
        jpanel = new Panel();
        panelToolBar = new JPanel();
        panelToolBar.setBackground(colorPanelToolBar);
        panelPrincipal = new JPanel();
        panelStatus = new JPanel();
        panelStatus.setBackground(colorBarraStatus);
        panelToolBarStatus = new JPanel();
        panelToolBarStatus.setBackground(colorPanelToolBar);


//        
        menuPrincipal = new JMenu("Principal");
        menuPrincipal.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));

        menuFiguras = new JMenu("Figuras");
        menuFiguras.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));

        buttonAmarelo = new JButton("Amarelo");

        buttonRetangulo = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/retangulo.png")));
        buttonRetangulo.setFocusPainted(true);
        buttonRetangulo.addActionListener(this);
        buttonRetangulo.setBackground(colorToolBarFormas);

        buttonLapis = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/pen.png")));
        buttonLapis.setFocusPainted(true);
        buttonLapis.addActionListener(this);
        buttonLapis.setBackground(colorToolBarFormas);

        buttonOval = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/oval.png")));
        buttonOval.setFocusPainted(true);
        buttonOval.addActionListener(this);
        buttonOval.setBackground(colorToolBarFormas);

        buttonTriangulo = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/triangulo.png")));
        buttonTriangulo.setFocusPainted(true);
        buttonTriangulo.addActionListener(this);
        buttonTriangulo.setBackground(colorToolBarFormas);

        buttonReta = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/reta.png")));
        buttonReta.setFocusPainted(true);
        buttonReta.addActionListener(this);
        buttonReta.setBackground(colorToolBarFormas);

        buttonRetanguloCA = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/retangulo_CA.png")));
        buttonRetanguloCA.setFocusPainted(true);
        buttonRetanguloCA.addActionListener(this);
        buttonRetanguloCA.setBackground(colorToolBarFormas);

        buttonPentagono = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/penta.png")));
        buttonPentagono.setFocusPainted(true);
        buttonPentagono.addActionListener(this);
        buttonPentagono.setBackground(colorToolBarFormas);

        buttonLosango = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/losangulo.png")));
        buttonLosango.setFocusPainted(true);
        buttonLosango.addActionListener(this);
        buttonLosango.setBackground(colorToolBarFormas);

        buttonHexagono = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/hexa.png")));
        buttonHexagono.setFocusPainted(true);
        buttonHexagono.addActionListener(this);
        buttonHexagono.setBackground(colorToolBarFormas);

        buttonPoligono = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/poligono.png")));
        buttonPoligono.setFocusPainted(true);
        buttonPoligono.addActionListener(this);
        buttonPoligono.setBackground(colorToolBarFormas);

        buttonTrianguloRet = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/triangulo-retangulo.png")));
        buttonTrianguloRet.setFocusPainted(true);
        buttonTrianguloRet.addActionListener(this);
        buttonTrianguloRet.setBackground(colorToolBarFormas);
        
        buttonCorLinha = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/corlinha.png")));
        buttonCorLinha.setFocusPainted(true);
        buttonCorLinha.addActionListener(this);
        buttonCorLinha.setBackground(colorPanelToolBar);
        buttonCorLinha.setToolTipText("Cor da Linha");
        
        buttonCorPreench = new JButton(new ImageIcon(getClass().getResource("/computacaografica/imagens/corpreenchida.png")));
        buttonCorPreench.setFocusPainted(true);
        buttonCorPreench.addActionListener(this);
        buttonCorPreench.setBackground(colorPanelToolBar);
        buttonCorPreench.setToolTipText("Cor do Preenchimento");
        

        itemMenuFigRatangulo = new JMenuItem("Retângulo");
        itemMenuFigRatangulo.addActionListener(this);
        itemMenuFigRatangulo.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));

        itemMenuAbrir = new JMenuItem("Atrir");
        itemMenuAbrir.addActionListener(this);
        itemMenuAbrir.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));

        itemMenuSalvar = new JMenuItem("Salvar");
        itemMenuSalvar.addActionListener(this);
        itemMenuSalvar.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 1));


        cbPreencher = new JComboBox();
        cbPreencher.setModel(new DefaultComboBoxModel(new String[] { "Cor Sólida","Sem preenchimento" }));
        cbPreencher.setSelectedIndex(1);
        cbPreencher.addActionListener(this);
        cbPreencher.setBackground(colorPanelToolBar);
        cbPreencher.setBorder(null);
        //cbPreencher.setForeground(colorPanelToolBar);
        cbPreencher.setToolTipText("Contorno");
        
        cbEspessura = new JComboBox();
        cbEspessura.setModel(new DefaultComboBoxModel(new String[] { "Linha 1px","Linha 3px","Linha 5px","Linha 8px" }));
        cbEspessura.setSelectedIndex(0);
        cbEspessura.addActionListener(this);
        cbEspessura.setBackground(colorPanelToolBar);
        cbEspessura.setBorder(null);
        cbEspessura.setToolTipText("Espessura da Linha");
        
        separador = new JSeparator(SwingConstants.HORIZONTAL);
        separador.setBorder(new BevelBorder(5, colorToolBarFormas, Color.LIGHT_GRAY));
        
        //componentes para a transformação
        
        buttonTransladar = new JButton("Transladar");
        buttonTransladar.addActionListener(this);
        buttonTransladar.setBackground(colorPanelToolBar);
        
        buttonCisalhar = new JButton("Cisalhar");
        buttonCisalhar.addActionListener(this);
        buttonCisalhar.setBackground(colorPanelToolBar);
        
        buttonEscalar = new JButton("Escalar");
        buttonEscalar.addActionListener(this);
        buttonEscalar.setBackground(colorPanelToolBar);
        
        buttonRotacionar = new JButton("Rotacionar");
        buttonRotacionar.addActionListener(this);
        buttonRotacionar.setBackground(colorPanelToolBar);
        /* Eventos*/

        jpanel.addMouseListener(this);
        jpanel.addMouseMotionListener(this);
//        this.addMouseListener(this);
//        this.addMouseMotionListener(this);

        /**/
        toolBarFormas = new JToolBar("Formas");
        toolBarFormas.setBackground(colorToolBarFormas);
       


        toolBar = new JToolBar();
        toolBar.setBackground(colorPanelToolBar);

        toolBarTransformacao = new JToolBar();
        toolBarTransformacao.setBackground(colorPanelToolBar);

        labelImageCursor = new JLabel(new ImageIcon(getClass().getResource("/computacaografica/imagens/cursor.png")));


        labelCursor = new JLabel("x:0 y:0");


    }

    public void montar() {

        this.setLayout(new BorderLayout(2, 2));

        menuPrincipal.add(itemMenuAbrir);
        menuPrincipal.add(itemMenuSalvar);
        jMenuBar.add(menuPrincipal);

        menuFiguras.add(itemMenuFigRatangulo);
        jMenuBar.add(menuFiguras);

        this.setJMenuBar(jMenuBar);


        this.add(panelPrincipal, BorderLayout.CENTER);

        panelPrincipal.setLayout(new BorderLayout(2, 2));
        panelPrincipal.add(panelToolBarStatus, BorderLayout.NORTH);

        panelToolBarStatus.setLayout(new BorderLayout(2, 2));
        panelToolBarStatus.add(panelToolBar, BorderLayout.WEST);

        panelToolBar.setLayout(new FlowLayout(FlowLayout.LEFT));
        panelToolBar.add(toolBar, FlowLayout.LEFT);
       // toolBar.add(buttonAmarelo);
        toolBar.add(new Label("Preenchimento:"));
        toolBar.add(cbPreencher);
        toolBar.add(buttonCorPreench);

        toolBar.add(new Label(" "));
        //toolBar.add(separador);
        toolBar.add(new Label("Espessura:"));
        toolBar.add(cbEspessura);
        toolBar.add(buttonCorLinha);
        //toolBar.add(panelCores);
        panelToolBar.add(toolBarFormas, FlowLayout.LEFT);
        toolBarFormas.add(buttonLapis);
        toolBarFormas.add(buttonReta);
        toolBarFormas.add(buttonOval);
        toolBarFormas.add(buttonRetangulo);
        toolBarFormas.add(buttonRetanguloCA);
//        toolBarFormas.add(buttonPoligono);
        toolBarFormas.add(buttonTriangulo);
        toolBarFormas.add(buttonTrianguloRet);
//        toolBarFormas.add(buttonLosango);
//        toolBarFormas.add(buttonPentagono);
//        toolBarFormas.add(buttonHexagono);

        panelToolBar.add(toolBarTransformacao);
        toolBarTransformacao.add(buttonTransladar);
        toolBarTransformacao.add(buttonCisalhar);
        toolBarTransformacao.add(buttonEscalar);
        toolBarTransformacao.add(buttonRotacionar);
        

        //panelToolBarStatus.add(panelStatus, BorderLayout.EAST);
        this.add(panelStatus, BorderLayout.SOUTH);
        panelStatus.setLayout(new FlowLayout(FlowLayout.LEFT));
        panelStatus.add(labelImageCursor);
        panelStatus.add(labelCursor);


        jpanel.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
        panelPrincipal.add(jpanel, BorderLayout.CENTER);


        //  panelPrincipal.add(jpanel, BorderLayout.CENTER);



        this.setSize(1000, 700);
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
       
        this.jpanel.repaint();
        

        
        this.jpanel.repaint();
    }

    @Override
    public void mousePressed(MouseEvent e) {

        atualizaCoordenadasMouse(e);
    }

    @Override
    public void mouseReleased(MouseEvent e) {

        atualizaCoordenadasMouse(e);

        switch (jpanel.getForma()) {

            case RETANGULO:
                releasedRetangulo();
                break;
            case OVAL:
                releasedOval();
                break;
            case TRIANGULO:
                releasedTriangulo();
                break;
            case RETANGULO_c:
                releasedRetanguloRound();
                break;
            case LAPIS:
                releasedLapis();
                break;
            case RETA:
                releasedReta();
                break;
            case TRIANGULORET:
                releasedTriangulo();
                break;

        }
    }

    @Override
    public void mouseDragged(MouseEvent e) {

        atualizaCoordenadasMouse(e);

        switch (jpanel.getForma()) {

            case RETANGULO:
                desenhaRetangulo(e);
                break;
            case OVAL:
                desenhaOval(e);
                break;
            case TRIANGULO:
                desenhaTriangulo(e);
                break;
            case RETANGULO_c:
                desenhaRetanguloRound(e);
                break;
            case LAPIS:
                desenhaLapis(e);
                break;
            case RETA:
                desenhaReta(e);
                break;
            case TRIANGULORET:
                desenhaTriangulo(e);
                break;
        }

    }

    @Override
    public void mouseEntered(MouseEvent e) {

        atualizaCoordenadasMouse(e);
    }

    @Override
    public void mouseExited(MouseEvent e) {

        atualizaCoordenadasMouse(e);

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == buttonRetangulo) {
            jpanel.setForma(FormasEnum.RETANGULO);
        }
        if (e.getSource() == buttonOval) {
            jpanel.setForma(FormasEnum.OVAL);
        }
        if ((e.getSource() == buttonTriangulo)) {
            jpanel.setForma(FormasEnum.TRIANGULO);
        }
        if (e.getSource() == buttonRetanguloCA) {
            jpanel.setForma(FormasEnum.RETANGULO_c);
        }
        if ((e.getSource() == buttonLapis)) {
            jpanel.setForma(FormasEnum.LAPIS);
        }
        if (e.getSource() == buttonReta) {
            jpanel.setForma(FormasEnum.RETA);
        }
        if (e.getSource() == buttonTrianguloRet) {
            jpanel.setForma(FormasEnum.TRIANGULORET);
        }
        if (e.getSource() == buttonPoligono) {
            jpanel.setForma(FormasEnum.POLIGONO);
        }
        if (e.getSource() == buttonPentagono) {
            jpanel.setForma(FormasEnum.PENTAGONO);
        }
        if (e.getSource() == buttonHexagono) {
            jpanel.setForma(FormasEnum.HEXAGONO);
        }
        if (e.getSource() == buttonLosango) {
            jpanel.setForma(FormasEnum.LOSANGO);
        }
        if (e.getSource() == itemMenuAbrir) {
            abrirImagem();
        }
        if (e.getSource() == itemMenuSalvar) {
            salvarImagem();
        }
        if (e.getSource() == cbPreencher) {
            JComboBox cb = (JComboBox)e.getSource();
            preencher = cb.getSelectedIndex() == 0 ? true:false; 
        }
        if (e.getSource() == cbEspessura) {
            JComboBox cb = (JComboBox)e.getSource();
            espessura = cb.getSelectedIndex() == 0 ? 1 : espessura;
            espessura = cb.getSelectedIndex() == 1 ? 3 : espessura;
            espessura = cb.getSelectedIndex() == 2 ? 5 : espessura;
            espessura = cb.getSelectedIndex() == 3 ? 8 : espessura;
        }
        if(e.getSource() == buttonCorLinha){
            escolherCorLinha();
        }
        if (e.getSource() == buttonCorPreench) {
            escolherCorPreenchimento();
        }
        if ((e.getSource() == buttonTransladar)) {
            transalar();
        }
        if(e.getSource() == buttonCisalhar){
            cisalhar();
        }
        if(e.getSource() == buttonRotacionar){
            rotacionar();
        }
        if(e.getSource() == buttonEscalar){
            escalar();
        }
            

    }

    public void atualizaCoordenadasMouse(MouseEvent e) {
        String x = "";
        String y = "";

        if (e.getX() < 0) {
            x = "0";
            y = "0";
        } else {
            x = String.valueOf(e.getX());
        }

        if (e.getY() < 0) {
            x = "0";
            y = "0";
        } else {
            y = String.valueOf(e.getY());
        }
        labelCursor.setText("x:" + x + "   y:" + y);
    }

    @Override
    public void mouseMoved(MouseEvent e) {

        atualizaCoordenadasMouse(e);
    }

    @Override
    public void adjustmentValueChanged(AdjustmentEvent e) {
        // throw new UnsupportedOperationException("Not supported yet.");
    }

    /*Metodo testa se o mouse moveu*/
    public boolean mouseHasMoved(MouseEvent e) {
        return (mousex != e.getX() || mousey != e.getY());
    }

    public void desenhaLapis(MouseEvent e) {
        Graphics2D g = (Graphics2D) jpanel.getGraphics();
        g.setColor(corLinha);
        g.setStroke(new BasicStroke(espessura));
        if (iniciaLapis) {

            setPosicaoInicial(e);
            iniciaLapis = false;
        }

        if (mouseHasMoved(e)) {


            g.drawLine(prevx, prevy, mousex, mousey);

            mousex = e.getX();
            mousey = e.getY();

            g.drawLine(prevx, prevy, mousex, mousey);

            prevx = mousex;
            prevy = mousey;
        }
    }

    public void releasedLapis() {
        iniciaLapis = true;
    }

    public void desenhaReta(MouseEvent e) {
        Graphics2D g = (Graphics2D) jpanel.getGraphics();
        g.setColor(corLinha);
        g.setStroke(new BasicStroke(espessura));
        if (iniciaReta) {
            setPosicaoInicial(e);
            g.setXORMode(jpanel.getBackground());
            g.drawLine(iniX, iniY, mousex, mousey);
            iniciaReta = false;
        }
        if (mouseHasMoved(e)) {

            g.setXORMode(jpanel.getBackground());
            g.drawLine(iniX, iniY, mousex, mousey);

            mousex = e.getX();
            mousey = e.getY();
            setVariaveisDesenho();

            g.drawLine(iniX, iniY, mousex, mousey);
        }
    }

    public void releasedReta() {
        iniciaReta = true;
//        Graphics g = jpanel.getGraphics();
//        g.setColor(corLinha);
//        g.drawLine(iniX, iniY, mousex, mousey);
        Reta reta = new Reta(iniX, iniY, mousex, mousey);
        reta.setCorLinha(corLinha);
        reta.setCorPreenchimento(corPreenchimento);
        reta.setEspessuraLinha(espessura);
        reta.setPreenche(preencher);
        listaFormas.addLast(reta);
        jpanel.repaint();
    }

    public void desenhaRetangulo(MouseEvent e) {
        Graphics2D g = (Graphics2D) jpanel.getGraphics();
        g.setColor(corLinha);
        g.setStroke(new BasicStroke(espessura));
        if (iniciaRetangulo) {

            setPosicaoInicial(e);
            iniciaRetangulo = false;
        }

        if (mouseHasMoved(e)) {

            g.setXORMode(jpanel.getBackground());
            g.drawRect(desenhaX, desenhaY, valorLargura, valorAltura);

            mousex = e.getX();
            mousey = e.getY();

            setVariaveisDesenho();
            g.drawRect(desenhaX, desenhaY, valorLargura, valorAltura);
            //   g.drawp
        }

    }

    public void releasedRetangulo() {
        iniciaRetangulo = true;
//        Graphics g = jpanel.getGraphics();
//        g.setColor(corLinha);
//        g.drawRect(desenhaX, desenhaY, valorLargura, valorAltura);
        Retangulo ret = new Retangulo(desenhaX, desenhaY, valorLargura, valorAltura);
        ret.setCorLinha(corLinha);
        ret.setCorPreenchimento(corPreenchimento);
        ret.setPreenche(preencher);
        ret.setEspessuraLinha(espessura);
        listaFormas.addLast(ret);
        jpanel.repaint();
    }

    public void setPosicaoInicial(MouseEvent e) {

        mousex = e.getX();
        mousey = e.getY();
        iniX = e.getX();
        iniY = e.getY();
        desenhaX = e.getX();
        desenhaY = e.getY();
        valorAltura = 0;
        valorLargura = 0;
        prevx = e.getX();
        prevy = e.getY();
    }

    private void setVariaveisDesenho() {

        if (mousex < iniX || mousey < iniY) {
            if (mousex < iniX) {
                valorLargura = iniX - mousex;
                desenhaX = iniX - valorLargura;
            } else {
                desenhaX = iniX;
                valorLargura = mousex - iniX;

            }
            if (mousey < iniY) {
                valorAltura = iniY - mousey;
                desenhaY = iniY - valorAltura;
            } else {
                desenhaY = iniY;
                valorAltura = mousey - iniY;
            }
        } else {
            desenhaX = iniX;
            desenhaY = iniY;
            valorLargura = mousex - iniX;
            valorAltura = mousey - iniY;
        }
    }

    public void desenhaOval(MouseEvent e) {
        Graphics2D g = (Graphics2D) jpanel.getGraphics();
        g.setColor(corLinha);
        g.setStroke(new BasicStroke(espessura));
        if (iniciaOval) {

            setPosicaoInicial(e);
            iniciaOval = false;
        }

        if (mouseHasMoved(e)) {

            g.setXORMode(jpanel.getBackground());
            g.drawOval(desenhaX, desenhaY, valorLargura, valorAltura);

            mousex = e.getX();
            mousey = e.getY();

            setVariaveisDesenho();

            g.drawOval(desenhaX, desenhaY, valorLargura, valorAltura);
        }
    }

    public void releasedOval() {
        iniciaOval = true;
        //cria uma forma e adiciona na lista para ser pintada no paint
        Oval oval = new Oval(desenhaX, desenhaY, valorLargura, valorAltura);
        oval.setCorLinha(corLinha);
        oval.setPreenche(preencher);
        oval.setEspessuraLinha(espessura);
        oval.setCorPreenchimento(corPreenchimento);
        listaFormas.addLast(oval);
        jpanel.repaint();
    }

    public void desenhaTriangulo(MouseEvent e) {

        Graphics2D g = (Graphics2D) jpanel.getGraphics();
        g.setColor(corLinha);
        g.setStroke(new BasicStroke(espessura));

//        g2.setStroke(a);


        if (iniciaTriangulo) {

            setPosicaoInicial(e);
            iniciaTriangulo = false;
        }
        if (mouseHasMoved(e)) {

            g.setXORMode(jpanel.getBackground());
            //g.drawOval(desenhaX, desenhaY, valorLargura, valorAltura);
            g.drawPolygon(montaTriangulo());


            mousex = e.getX();
            mousey = e.getY();

            setVariaveisDesenho();

            //g.(desenhaX, desenhaY, valorLargura, valorAltura);
            g.drawPolygon(montaTriangulo());

        }
    }

    public void releasedTriangulo() {
        iniciaTriangulo = true;
//        Graphics g = jpanel.getGraphics();
//        g.setColor(corLinha);
//        Graphics2D g2 = (Graphics2D) g;
////        BasicStroke a = new BasicStroke(5F);
////        g2.setStroke(a);
//        g2.drawPolygon(montaTriangulo());
//        //g.drawOval(desenhaX, desenhaY, valorLargura, valorAltura);
        Triangulo tr = new Triangulo(montaTriangulo());
        tr.setCorLinha(corLinha);
        tr.setCorPreenchimento(corPreenchimento);
        tr.setPreenche(preencher);
        tr.setEspessuraLinha(espessura);
        listaFormas.addLast(tr);
        jpanel.repaint();
    }

    private Polygon montaTriangulo() {

        switch (jpanel.getForma()) {

            case TRIANGULO:

                Polygon triangulo;
                if (mousex > iniX && mousey > iniY) {
                    int[] xPontos = {iniX, (iniX + (mousex - iniX) / 2), mousex};
                    int[] yPontos = {mousey, iniY, mousey};

                    triangulo = new Polygon(xPontos, yPontos, 3);
                    return triangulo;
                } else if (mousex > iniX && mousey < iniY) {

                    int[] xPontos = {mousex, iniX, (iniX + (mousex - iniX) / 2)};
                    int[] yPontos = {iniY, iniY, mousey};

                    triangulo = new Polygon(xPontos, yPontos, 3);
                    return triangulo;

                } else if (mousex < iniX && mousey < iniY) {


                    int[] xPontos = {mousex, iniX, (mousex + (iniX - mousex) / 2)};
                    int[] yPontos = {iniY, iniY, mousey};

                    triangulo = new Polygon(xPontos, yPontos, 3);
                    return triangulo;

                } else {

                    int[] xPontos = {iniX, mousex, (mousex + (iniX - mousex) / 2)};
                    int[] yPontos = {mousey, mousey, iniY};

                    triangulo = new Polygon(xPontos, yPontos, 3);
                    return triangulo;
                }
            case TRIANGULORET:

                Polygon trianguloRet;
                if (mousex > iniX && mousey > iniY) {
                    int[] xPontos = {iniX, (iniX), mousex};
                    int[] yPontos = {mousey, iniY, mousey};

                    trianguloRet = new Polygon(xPontos, yPontos, 3);
                    return trianguloRet;
                } else if (mousex > iniX && mousey < iniY) {

                    int[] xPontos = {mousex, iniX, (iniX)};
                    int[] yPontos = {iniY, iniY, mousey};

                    trianguloRet = new Polygon(xPontos, yPontos, 3);
                    return trianguloRet;

                } else if (mousex < iniX && mousey < iniY) {

                    int[] xPontos = {mousex, iniX, (mousex)};
                    int[] yPontos = {iniY, iniY, mousey};

                    trianguloRet = new Polygon(xPontos, yPontos, 3);
                    return trianguloRet;

                } else {

                    int[] xPontos = {iniX, mousex, (mousex)};
                    int[] yPontos = {mousey, mousey, iniY};

                    trianguloRet = new Polygon(xPontos, yPontos, 3);
                    return trianguloRet;
                }
        }
        return null;
    }

    private void releasedRetanguloRound() {
        iniciaRetanguloCA = true;
//        Graphics g = jpanel.getGraphics();
//        g.setColor(corLinha);
//        g.drawRoundRect(desenhaX, desenhaY, valorLargura, valorAltura, valorAltura / 5, valorAltura / 5);
        RetanguloRound rr = new RetanguloRound(desenhaX, desenhaY, valorLargura, valorAltura);
        rr.setCorLinha(corLinha);
        rr.setCorPreenchimento(corPreenchimento);
        rr.setPreenche(preencher);
        rr.setEspessuraLinha(espessura);
        listaFormas.addLast(rr);
        jpanel.repaint();
        
    }

    private void desenhaRetanguloRound(MouseEvent e) {
        Graphics2D g = (Graphics2D) jpanel.getGraphics();

        g.setColor(corLinha);
        g.setStroke(new BasicStroke(espessura));

        if (iniciaRetanguloCA) {

            setPosicaoInicial(e);
            iniciaRetanguloCA = false;
        }

        if (mouseHasMoved(e)) {

            g.setXORMode(jpanel.getBackground());
            g.drawRoundRect(desenhaX, desenhaY, valorLargura, valorAltura, valorAltura / 5, valorAltura / 5);
          

            mousex = e.getX();
            mousey = e.getY();

            setVariaveisDesenho();
            g.drawRoundRect(desenhaX, desenhaY, valorLargura, valorAltura, valorAltura / 5, valorAltura / 5);
        }
    }

    private void desenhaPolignoGenerico(MouseEvent e) {

        Graphics g = jpanel.getGraphics();
        g.setColor(corLinha);

        Graphics2D g2 = (Graphics2D) g;

        if (iniciaPoligno) {

            setPosicaoInicial(e);
            iniciaPoligno = false;
        }
        if (mouseHasMoved(e)) {

            g2.setXORMode(jpanel.getBackground());
            //g.drawOval(desenhaX, desenhaY, valorLargura, valorAltura);
            g2.drawPolygon(montaPoligno());


            mousex = e.getX();
            mousey = e.getY();

            setVariaveisDesenho();

            //g.(desenhaX, desenhaY, valorLargura, valorAltura);
            g2.drawPolygon(montaPoligno());
            //g2.set

        }
    }

    private Polygon montaPoligno() {

        Polygon poligno;

        switch (jpanel.getForma()) {
            case HEXAGONO:




                break;
        }


        return null;
    }

    private void abrirImagem() {
    }

    private void salvarImagem() {

        BufferedImage image = new BufferedImage(jpanel.getWidth(), jpanel.getHeight(), BufferedImage.TYPE_INT_RGB);
        image.createGraphics();
        Graphics g = image.getGraphics();
        Graphics2D g2d = (Graphics2D) g.create();
//        Graphics2D g2 = (Graphics2D) jpanel.getGraphics();
//        
//        Rectangle2D a;
//        Ellipse2D b;
//                
//       
        g2d.draw(new Retangulo(prevx, prevy, iniX, iniX));

        jpanel.paint(g);
        File file = new File("c://_cliente//imagem.png");
        g.dispose();
        try {
            ImageIO.write(image, "png", file);
        } catch (IOException ex) {
            Logger.getLogger(Janela.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getDesenhaX() {
        return desenhaX;
    }

    public int getDesenhaY() {
        return desenhaY;
    }

    public int getIniX() {
        return iniX;
    }

    public int getIniY() {
        return iniY;
    }

    public int getMousex() {
        return mousex;
    }

    public int getMousey() {
        return mousey;
    }

    public int getPrevx() {
        return prevx;
    }

    public int getPrevy() {
        return prevy;
    }

    public int getValorAltura() {
        return valorAltura;
    }

    public int getValorLargura() {
        return valorLargura;
    }

    private void escolherCorLinha() {
        //JColorChooser c = new JColorChooser(corLinha);
        //c.show();
        corLinha =JColorChooser.showDialog(jpanel, "Escolha a cor da linha.", corLinha);
                
    }

    private void escolherCorPreenchimento() {
        corPreenchimento = JColorChooser.showDialog(jpanel, "Escolha a cor de preenchimento.", corLinha);
    }

    private void transalar() {
        //String ponto = JOptionPane.showInputDialog(jpanel, "Digite o ponto a Transladar","Transladar!",JOptionPane.INFORMATION_MESSAGE);   
        isEscalar = false;
        isRotacionar = false;
        isCisalhar = false;
        isTransladar = true;
        ((Formas)Janela.listaFormas.getLast()).setEscalar(false);
        ((Formas)Janela.listaFormas.getLast()).setCisalhar(false);
        ((Formas)Janela.listaFormas.getLast()).setRotacionar(false);
        transladarX  = 50;
        transladarY = 50;
        jpanel.repaint();
        
    }

    private void cisalhar() {
        isEscalar = false;
        isRotacionar = false;
        isCisalhar = true;
        isTransladar = false;
                
        cisalarX = 0.2;
        cisalarY = 0.3;
        ((Formas)Janela.listaFormas.getLast()).setEscalar(false);
        ((Formas)Janela.listaFormas.getLast()).setCisalhar(isCisalhar);
        ((Formas)Janela.listaFormas.getLast()).setRotacionar(false);
       jpanel.repaint();
    }

    private void escalar() {
        isEscalar = true;
        isRotacionar = false;
        isCisalhar = false;
        isTransladar = false;
                
        escalarX = 0.4;
        escalarY = 0.5;
        ((Formas)Janela.listaFormas.getLast()).setEscalar(isEscalar);
        ((Formas)Janela.listaFormas.getLast()).setCisalhar(false);
        ((Formas)Janela.listaFormas.getLast()).setRotacionar(false);
        jpanel.repaint();
        
    }

    private void rotacionar() {

        isEscalar = false;
        isRotacionar = true;
        isCisalhar = false;
        isTransladar = false;
        rotacionar = 0.2;
        ((Formas)Janela.listaFormas.getLast()).setEscalar(false);
        ((Formas)Janela.listaFormas.getLast()).setCisalhar(false);
        ((Formas)Janela.listaFormas.getLast()).setRotacionar(isRotacionar);
        jpanel.repaint();
    }

    public boolean isCisalhar() {
        return isCisalhar;
    }

    public boolean isRotacionar() {
        return isRotacionar;
    }

    public boolean isTransladar() {
        return isTransladar;
    }

    public double getCisalarX() {
        return cisalarX;
    }

    public double getCisalarY() {
        return cisalarY;
    }

    public double  getRotacionar() {
        return rotacionar;
    }

    public int getTransladarX() {
        return transladarX;
    }

    public int getTransladarY() {
        return transladarY;
    }

    public void setCisalhar(boolean isCisalhar) {
        this.isCisalhar = isCisalhar;
    }

    public void setRotacionar(boolean isRotacionar) {
        this.isRotacionar = isRotacionar;
    }

    public void setTransladar(boolean isTransladar) {
        this.isTransladar = isTransladar;
    }

    public double  getEscalarX() {
        return escalarX;
    }

    public void setEscalarX(int escalarX) {
        this.escalarX = escalarX;
    }

    public double  getEscalarY() {
        return escalarY;
    }

    public void setEscalarY(int escalarY) {
        this.escalarY = escalarY;
    }

    public boolean isEscalar() {
        return isEscalar;
    }

    public void setEscalar(boolean isEscalar) {
        this.isEscalar = isEscalar;
    }

    

    

            
}
